1
Uma transação é uma unidade de trabalho
DSAI2202Transactions in SQL Databases
00:00

As alterações nos dados raramente chegam sozinhas: uma transferência tem de debitar uma conta e creditar outra, e um pedido tem de reservar stock e registar um pagamento. Se o sistema parar a meio, a base de dados fica a descrever um mundo que nunca existiu. Uma transação é a resposta da base de dados para esse problema — uma sequência de uma ou mais operações que a base de dados trata como uma única e indivisível unidade de trabalho.

Tudo, ou nada

Dentro de uma transação, cada operação pertence a um único resultado. A base de dados nunca expõe um estado final em que apenas parte da transação ocorreu. O exemplo clássico é uma transferência entre duas contas bancárias: reduzir o saldo da conta de origem e, em seguida, aumentar o saldo da conta de destino. Se apenas o primeiro passo fosse bem-sucedido, o dinheiro desapareceria; se apenas o segundo, o dinheiro apareceria do nada. Envolver ambos os passos numa única transação elimina as duas possibilidades.

Esta garantia de tudo ou nada chama-se atomicidade. Commit é o ato que torna permanentes as alterações da transação; uma transação que nunca faz commit não deixa qualquer vestígio. Durabilidade acrescenta a peça final: depois de o commit ter sido concluído, a alteração sobrevive mesmo que a máquina perca a energia um momento depois.

Uma transação é uma unidade de trabalhoUma transação é uma unidade de trabalhoAtomicidade: tudo, ou nada.Fronteira da transaçãouma unidade de trabalhoPasso 1 — Debitar a conta de origemPasso 2 — Creditar a conta de destinoExistem estados intermédios dentro da fronteira,mas são privados desta transação.✓COMMITAmbas as alterações permanentesSobrevive a uma falha após o commit↺ROLLBACKNenhuma conta alteradaNão deixa qualquer vestígioUma transação é uma sequência de uma ou mais operações tratadas como uma única e indivisível unidade de trabalho.

Uma transação é uma fronteira

Ajuda visualizar uma transação como uma fronteira traçada em torno de um conjunto de instruções. Antes da fronteira e depois dela, os dados cumprem as regras impostas pela estrutura. Dentro da fronteira existem estados intermédios — uma conta já está debitada enquanto a outra ainda não foi creditada — mas esses estados são privados da transação. As instruções posteriores noutras sessões não os tratam como a verdade.

Dois papéis ao mesmo tempo

Por isso, as transações desempenham dois papéis. O primeiro é o tratamento de falhas: se o processo falhar, a ligação cair ou uma instrução gerar um erro, a base de dados pode restaurar o estado que existia antes de a transação começar. O segundo é o controlo de visibilidade: enquanto o trabalho está em curso, os outros leitores ficam protegidos do resultado inacabado. Estes dois papéis estão relacionados, mas não são idênticos — a atomicidade decide se as alterações são mantidas, enquanto a visibilidade é regida pelo isolamento, a configuração que controla o quanto as transações concorrentes podem ver umas das outras.

Mantenha a unidade numa só ligação
O estado da transação pertence a uma ligação ou sessão, pelo que a instrução que abre a transação e o commit que a termina têm de ser executados na mesma ligação. Muitos drivers também funcionam em autocommit modo autocommit, em que cada instrução individual é a sua própria transação — uma unidade com várias instruções precisa do autocommit desativado ou de um início explícito.